package LC;

/**
 * @author lhn
 * @date 2024-09-18 17:43
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 * 函数 myAtoi(string s) 的算法如下：
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 * 返回整数作为最终结果。
 */

public class StringToIntegerAtoi {
    public static void main(String[] args) {
//        System.out.println(myAtoi("   -42"));
//        System.out.println(myAtoi("4193 with words"));
//        System.out.println(myAtoi("words and 987"));
//        System.out.println(myAtoi("-91283472332"));
//        System.out.println(myAtoi("1337c0d3"));
//        System.out.println(myAtoi(""));
//        System.out.println(myAtoi("9223372036854775808"));
        System.out.println(myAtoi("-2147483648"));
        System.out.println(myAtoi("2147483646"));
    }
    public static int myAtoi(String s) {
        // 去掉首尾空格
        s = s.strip();
        if (s.length() == 0) return 0;
        boolean isNegative = false;

        char[] chars = s.toCharArray();
        char c = chars[0];
        int index = 0;
        long res = 0;
        if (c == '-') {
            isNegative = true;
            index ++;
        } else if (c == '+') {
            isNegative = false;
            index ++;
        } else if (c < '0' || c > '9') {
            return 0;
        }
        for (int i = index; i < chars.length; i++) {
            char ch = chars[i];
            if (ch < '0' || ch > '9') {
                break;
            } else {
                // 注意检查溢出
                if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (ch - '0') > Integer.MAX_VALUE % 10)) {
                    return isNegative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
                if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (ch - '0') > -(Integer.MIN_VALUE % 10))) {
                    return isNegative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
                res = res * 10 + ch - '0';

            }
        }
        if (isNegative) {
            res = -res;
        }


        return (int) res;
    }
}
